package com.example.aop.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 使用Proxy和InvocationHandler创建动态代理
 * @author: qilongxin
 * @date: 2021/8/18 11:33
 */
public class ProxyTest1 {
    /*
      介绍一下Proxy类的两个方法：
      1.创建一个动态代理类所对应的Class对象：
          Class<?> getProxyClass(ClassLoader loader, Class<?>...interfaces)
      2.直接创建一个动态代理对象：
          Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
     */

    public static void main(String[] args) {
        // 创建InvocationHandler对象， 创建代理对象需要传入一个InvocationHandler对象
        InvocationHandler handler = new MyInvocationHandler();
        // 使用指定的InvocationHandler生成动态代理对象
        Person p = (Person) Proxy.newProxyInstance(Person.class.getClassLoader(), new Class[]{Person.class}, handler);
        // 调用动态代理对象的方法
        p.walk();
        p.sayHello("汤姆猫");
    }
}

interface Person {
    void walk();
    void sayHello(String name);
}

class MyInvocationHandler implements InvocationHandler {
    /**
     * 执行代理对象的所有方法时，会替换成执行invoke方法
     * proxy: 代理对象
     * method: 正在执行的方法
     * args: 传入方法的实参
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("----正在执行的方法：" + method);
        if (args != null) {
            for (Object val : args) {
                System.out.println(val);
            }
        } else {
            System.out.println("执行的方法没有实参。");
        }
        return null;
    }
}
